CloudWatchアラームのイベントをZabbixに連携させてみた
どうしてもZabbixで監視をしたい
こんにちは、のんピ(@non____97)です。
皆さんはどうしてもZabbixで監視をしたいなと思ったことはありますか? 私はありません。
ZabbixではAWS by HTTPというZabbix公式が提供しているテンプレートがあります。
こちらを使用することでAWS側での追加設定なしでEC2、EBS、RDS、ECS、S3の監視が可能となります。
しかし、こちらのテンプレートを利用して監視できるリソースは上述のリソースと限られます。ELBやElastiCacheなど他サービスを監視する場合は、Zabbixからカスタムスクリプトで定期的にメトリクスをポーリングしてデータを取得してあげるなどの作り込みが必要になります。
個人的には全てを一つの基盤で監視するのは難しいと考えます。餅は餅屋です。
とは言っても、のっぴきならない理由で、どうしてもZabbixを使う必要がある場面もあります。
その際はPagerDutyなど複数の監視基盤を統合する製品を導入すると良いでしょう。
ただし、このような製品を導入しようにも監視体制の変更ができず、コスト的にも導入が難しいパターンもあると思います。
そのような場合は、CloudWatchアラームのイベントをLambda関数からZabbix SenderでZabbix Serverに送りつけることで対応が可能と考えます。
以降その方法について説明します。
対応方法
CloudWatchアラームでメトリクスを監視し、CloudWatchアラームのイベントをトリガーにLambda関数をキックして、Zabbix SenderでCloudWatchアラームのイベントをZabbix Serverに送ります。
対応方法を図示すると以下の通りです。
CloudWatchアラームやLambda関数、Zabbix側の事前準備としては以下があります。
- CloudWatch Alarmへの以下タグの付与
- Zabbixのホスト名
- Zabbixのアイテムのキー名
- Lambda関数の環境変数に以下を設定
- Zabbix ServerのIPアドレス
- Zabbix Serverのポート番号
- Zabbixのホストとアイテムの設定
- Zabbixのトリガー設定
CloudWatchアラームの状態が遷移した場合は以下の処理が行われます。
- EventBridgeでCloudWatch Alarmのイベント拾う
- イベントの条件には「CloudWatchアラーム名の末尾が
to-zabbix
」などZabbixに連携したいCloudWatchアラームで統一して設定できるプロパティを指定する
- イベントの条件には「CloudWatchアラーム名の末尾が
- Lambda関数を起動
- イベントのAlarm名と一致するCloudWatch Alarmのタグを取得
- Lambda関数に設定された環境変数を取得
- (3)と(4)で取得した情報をもとに、Zabbix SenderでCloudWatch AlarmのイベントをJSON stringifyして送信
使用するLambda関数のコードは以下の通りです。
import boto3 import os import json import logging from pyzabbix import ZabbixMetric, ZabbixSender logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): try: logger.info(event) # Get alarm ARN from event alarm_arn = event['resources'][0] # Create a Resource Groups Tagging API client resource_tagging_client = boto3.client('resourcegroupstaggingapi') # Get the resource tags response = resource_tagging_client.get_resources(ResourceARNList=[alarm_arn]) zabbix_host = None zabbix_item_key = None # Assuming ResourceTagMappingList always contains exactly one item resource_tags = response['ResourceTagMappingList'][0]['Tags'] for tag in resource_tags: if tag['Key'] == 'Zabbix Host': zabbix_host = tag['Value'] elif tag['Key'] == 'Zabbix Item Key': zabbix_item_key = tag['Value'] if zabbix_host is None or zabbix_item_key is None: logger.error("Zabbix tags are not properly set") return zabbix_server_ip = os.getenv('ZABBIX_SERVER_IP_ADDRESS') zabbix_server_port = int(os.getenv('ZABBIX_SERVER_PORT')) zabbix_event_data = [ZabbixMetric(zabbix_host, zabbix_item_key, json.dumps(event))] zabbix_sender = ZabbixSender(zabbix_server_ip, zabbix_server_port) zabbix_sender_response = zabbix_sender.send(zabbix_event_data) logger.info(zabbix_sender_response) except Exception as e: logger.error("Error occurred: {}".format(e))
py-zabbix
によりLambda関数の環境変数で指定したZabbix Serverに対して、CloudWatchアラームのタグに指定しているホストとキーを使ってアイテムを送りつけます。
py-zabbix
の詳細は以下をご覧ください。
今回のパターン以外にも、都度メトリクスをZabbix Senderで送りつけるパターンもあります。しかし、メトリクスの数だけLambda関数が必要になりますし、監視対象のメトリクスをJSONか何かで定義して、1つのLambda関数で対応しようにもメンテナンスが大変そうです。要するに監視がスケールしません。
また、CloudWatch Logsを使ったログ監視をする場合、サブスクリプションフィルターでLambda関数をキックしZabbix SenderでZabbixにログを送りつけるというのも、ログ量によってはZabbix Serverおよび、Zabbix Serverまでの経路に負荷がかかりそうです。
そういった意味でも都度メトリクスやログをZabbix Senderで送りつける手法はオススメしづらいと言えます。
一方、今回の手法は監視対象が増えた場合に以下リソースを増やすだけです。監視対象の数だけLambda関数やEventBridge Rule or EventBridge Schedulerを用意する必要はありません。
- CloudWatch アラーム
- Zabbix側のホストとアイテム設定
さらに、CloudWatchアラームのタグでZabbixのホストとキーを定義しているため、監視対象が追加された場合もLambda関数のコードを変更する必要はありません。
また、CloudWatchアラームの状態が遷移したタイミングでZabbix Serverにイベントを送りつけるので、Zabbix Serverへの負荷も低いと考えます。
こちらの方式の注意すべき点としては、以下3点が挙げられます。
- Zabbixのコンソールから監視対象のデータの遷移を確認することができない
- CloudWatchアラームの状態が遷移したときのデータしか確認できない
- CloudWatchアラームに対して料金がかかる
- VPC Lambda用のNAT Gatewayの料金がかかる
(1)については、「データの遷移の様子をグラフで確認したい際はCloudWatchのコンソールを確認する」という運用が許容できるのであれば問題ないと思います。
(2)については「アラームメトリクスあたり 0.10USD」の料金が発生します。ただ、人が頑張って大量のLambda関数をメンテナンスするコストを考えるとお安いのではないでしょうか。
(3)については「NAT Gatewayあたり0.062USD/h」と「処理データ 1 GB あたり0.062USD」の料金が発生します。
Lambda関数がインターネットに出る要件が、CloudWatchアラームのタグ取得とログ出力用のCloudWatch Logsのみなのであれば、各サービス用のVPCエンドポイントを用意するのも良いでしょう。VPCエンドポイントであれば「VPCエンドポイントあたり0.014USD/h」、「処理データ 1 GB あたり0.01USD」とNAT Gatewayを使うよりもお安くなります。
複数環境があるのであれば、コスト削減のためVPCエンドポイントを集約させるのもの良いでしょう。
検証環境
検証環境の構成図は以下の通りです。
今回はStep Functionsのステートマシンが実行されたら、アラーム状態になるようなCloudWatchアラームを準備しました。
こちらの検証環境は基本的にAWS CDKで用意しました。使用したコードは以下リポジトリに保存しています。
デプロイ後はLambda関数のENIにElastic IPアドレスを手動で割り当てます。
本来VPC Lambdaを使用する場合はNAT Gatewayを使用するのがセオリーです。AWS CDKでVPC LambdaをNAT GatewayがないPublic Subnetに配置しようとすると以下のようなメッセージが出てエラーになります。
Error: Lambda Functions in a public subnet can NOT access the internet. If you are aware of this limitation and would still like to place the function in a public subnet, set `allowPublicSubnet` to true
今回はNAT Gatewayの料金節約のため、allowPublicSubnet
をtrue
にした上で、Elastic IPアドレスの割り当てを行いました。
NAT Gatewayを使用せずにVPC Lambdaの設定をする方法は以下記事でも紹介されています。
Zabbix Serverのセットアップ
パッケージのインストール
まず、Zabbix Serverのセットアップを行います。
Zabbix ServerとするEC2インスタンスはRHEL 9.2です。使用したAMIは以下の通りです。
- RHEL-9.2.0_HVM-20230615-x86_64-3-Hourly2-GP2
- ami-01cc36e92a4e9a428
$ cat /etc/os-release NAME="Red Hat Enterprise Linux" VERSION="9.2 (Plow)" ID="rhel" ID_LIKE="fedora" VERSION_ID="9.2" PLATFORM_ID="platform:el9" PRETTY_NAME="Red Hat Enterprise Linux 9.2 (Plow)" ANSI_COLOR="0;31" LOGO="fedora-logo-icon" CPE_NAME="cpe:/o:redhat:enterprise_linux:9::baseos" HOME_URL="https://www.redhat.com/" DOCUMENTATION_URL="https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9" BUG_REPORT_URL="https://bugzilla.redhat.com/" REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 9" REDHAT_BUGZILLA_PRODUCT_VERSION=9.2 REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux" REDHAT_SUPPORT_PRODUCT_VERSION="9.2"
セットアップ手順は以下Zabbix公式の手順に従って行います。
構成は以下の通りです。
- Zabbix version : 6.0 LTS
- Zabbix component : Server, Frontend, Agent
- Database : PostgreSQL
- Web Server : Nginx
Zabbixリポジトリのインストールを行います。
$ sudo rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/9/x86_64/zabbix-release-6.0-4.el9.noarch.rpm Retrieving https://repo.zabbix.com/zabbix/6.0/rhel/9/x86_64/zabbix-release-6.0-4.el9.noarch.rpm warning: /var/tmp/rpm-tmp.w7MYKh: Header V4 RSA/SHA512 Signature, key ID 08efa7dd: NOKEY Verifying... ################################# [100%] Preparing... ################################# [100%] Updating / installing... 1:zabbix-release-6.0-4.el9 ################################# [100%] $ sudo dnf clean all Updating Subscription Management repositories. Unable to read consumer identity This system is not registered with an entitlement server. You can use subscription-manager to register. 27 files removed
Zabbix Server, Frontend, Zabbix Agentをインストールします。
$ sudo dnf install zabbix-server-pgsql zabbix-web-pgsql zabbix-nginx-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent Updating Subscription Management repositories. Unable to read consumer identity This system is not registered with an entitlement server. You can use subscription-manager to register. Red Hat Enterprise Linux 9 for x86_64 - AppStream from RHUI (RPMs) 50 MB/s | 24 MB 00:00 Red Hat Enterprise Linux 9 for x86_64 - BaseOS from RHUI (RPMs) 43 MB/s | 13 MB 00:00 Red Hat Enterprise Linux 9 Client Configuration 36 kB/s | 3.2 kB 00:00 Zabbix Official Repository - x86_64 194 kB/s | 210 kB 00:01 Zabbix Official Repository (non-supported) - x86_64 1.6 kB/s | 1.1 kB 00:00 Zabbix Official Repository (Agent2 Plugins) - x86_64 2.4 kB/s | 1.6 kB 00:00 Dependencies resolved. ============================================================================================================================= Package Architecture Version Repository Size ============================================================================================================================= Installing: zabbix-agent x86_64 6.0.20-release1.el9 zabbix 532 k zabbix-nginx-conf noarch 6.0.20-release1.el9 zabbix 13 k zabbix-selinux-policy x86_64 6.0.20-release1.el9 zabbix 258 k zabbix-server-pgsql x86_64 6.0.20-release1.el9 zabbix 1.8 M zabbix-sql-scripts noarch 6.0.20-release1.el9 zabbix 7.4 M zabbix-web-pgsql noarch 6.0.20-release1.el9 zabbix 12 k Installing dependencies: OpenIPMI-libs x86_64 2.0.32-3.el9 rhel-9-appstream-rhui-rpms 518 k fontconfig x86_64 2.14.0-2.el9_1 rhel-9-appstream-rhui-rpms 301 k fping x86_64 5.1-1.el9 zabbix-non-supported 35 k freetype x86_64 2.10.4-9.el9 rhel-9-baseos-rhui-rpms 391 k gd x86_64 2.3.2-3.el9 rhel-9-appstream-rhui-rpms 134 k graphite2 x86_64 1.3.14-9.el9 rhel-9-baseos-rhui-rpms 98 k harfbuzz x86_64 2.7.4-8.el9 rhel-9-baseos-rhui-rpms 629 k httpd-filesystem noarch 2.4.53-11.el9_2.5 rhel-9-appstream-rhui-rpms 17 k jbigkit-libs x86_64 2.1-23.el9 rhel-9-appstream-rhui-rpms 56 k libX11 x86_64 1.7.0-7.el9 rhel-9-appstream-rhui-rpms 648 k libX11-common noarch 1.7.0-7.el9 rhel-9-appstream-rhui-rpms 210 k libXau x86_64 1.0.9-8.el9 rhel-9-appstream-rhui-rpms 34 k libXpm x86_64 3.5.13-8.el9_1 rhel-9-appstream-rhui-rpms 60 k libjpeg-turbo x86_64 2.0.90-6.el9_1 rhel-9-appstream-rhui-rpms 178 k libpng x86_64 2:1.6.37-12.el9 rhel-9-baseos-rhui-rpms 119 k libpq x86_64 13.5-1.el9 rhel-9-appstream-rhui-rpms 208 k libtiff x86_64 4.4.0-8.el9_2 rhel-9-appstream-rhui-rpms 200 k libtool-ltdl x86_64 2.4.6-45.el9 rhel-9-appstream-rhui-rpms 39 k libwebp x86_64 1.2.0-6.el9_1 rhel-9-appstream-rhui-rpms 281 k libxcb x86_64 1.13.1-9.el9 rhel-9-appstream-rhui-rpms 247 k libxslt x86_64 1.1.34-9.el9 rhel-9-appstream-rhui-rpms 247 k net-snmp-libs x86_64 1:5.9.1-9.el9 rhel-9-appstream-rhui-rpms 760 k nginx x86_64 1:1.20.1-14.el9 rhel-9-appstream-rhui-rpms 43 k nginx-core x86_64 1:1.20.1-14.el9 rhel-9-appstream-rhui-rpms 576 k nginx-filesystem noarch 1:1.20.1-14.el9 rhel-9-appstream-rhui-rpms 13 k oniguruma x86_64 6.9.6-1.el9.5 rhel-9-appstream-rhui-rpms 221 k php-bcmath x86_64 8.0.27-1.el9_1 rhel-9-appstream-rhui-rpms 38 k php-common x86_64 8.0.27-1.el9_1 rhel-9-appstream-rhui-rpms 686 k php-fpm x86_64 8.0.27-1.el9_1 rhel-9-appstream-rhui-rpms 1.6 M php-gd x86_64 8.0.27-1.el9_1 rhel-9-appstream-rhui-rpms 43 k php-ldap x86_64 8.0.27-1.el9_1 rhel-9-appstream-rhui-rpms 43 k php-mbstring x86_64 8.0.27-1.el9_1 rhel-9-appstream-rhui-rpms 473 k php-pdo x86_64 8.0.27-1.el9_1 rhel-9-appstream-rhui-rpms 87 k php-pgsql x86_64 8.0.27-1.el9_1 rhel-9-appstream-rhui-rpms 76 k php-xml x86_64 8.0.27-1.el9_1 rhel-9-appstream-rhui-rpms 138 k redhat-logos-httpd noarch 90.4-1.el9 rhel-9-appstream-rhui-rpms 18 k unixODBC x86_64 2.3.9-4.el9 rhel-9-appstream-rhui-rpms 495 k xml-common noarch 0.6.3-58.el9 rhel-9-appstream-rhui-rpms 36 k zabbix-web noarch 6.0.20-release1.el9 zabbix 7.4 M zabbix-web-deps noarch 6.0.20-release1.el9 zabbix 13 k Transaction Summary ============================================================================================================================= Install 46 Packages Total download size: 27 M Installed size: 93 M Is this ok [y/N]: y Downloading Packages: (1/46): redhat-logos-httpd-90.4-1.el9.noarch.rpm 346 kB/s | 18 kB 00:00 (2/46): libtool-ltdl-2.4.6-45.el9.x86_64.rpm 664 kB/s | 39 kB 00:00 (3/46): libX11-common-1.7.0-7.el9.noarch.rpm 3.1 MB/s | 210 kB 00:00 . . (中略) . . (43/46): zabbix-web-pgsql-6.0.20-release1.el9.noarch.rpm 80 kB/s | 12 kB 00:00 (44/46): zabbix-sql-scripts-6.0.20-release1.el9.noarch.rpm 11 MB/s | 7.4 MB 00:00 (45/46): fping-5.1-1.el9.x86_64.rpm 178 kB/s | 35 kB 00:00 (46/46): zabbix-web-6.0.20-release1.el9.noarch.rpm 8.3 MB/s | 7.4 MB 00:00 -------------------------------------------------------------------------------------------------------------------------------------------------------- Total 11 MB/s | 27 MB 00:02 Zabbix Official Repository - x86_64 3.0 MB/s | 3.1 kB 00:00 Importing GPG key 0x08EFA7DD: Userid : "Zabbix LLC (Jul 2022) <[email protected]>" Fingerprint: D9AA 84C2 B617 479C 6E4F CF4D 19F2 4753 08EF A7DD From : /etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-08EFA7DD Is this ok [y/N]: y Key imported successfully Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction . . (中略) . . Installed: OpenIPMI-libs-2.0.32-3.el9.x86_64 fontconfig-2.14.0-2.el9_1.x86_64 fping-5.1-1.el9.x86_64 freetype-2.10.4-9.el9.x86_64 gd-2.3.2-3.el9.x86_64 graphite2-1.3.14-9.el9.x86_64 harfbuzz-2.7.4-8.el9.x86_64 httpd-filesystem-2.4.53-11.el9_2.5.noarch jbigkit-libs-2.1-23.el9.x86_64 libX11-1.7.0-7.el9.x86_64 libX11-common-1.7.0-7.el9.noarch libXau-1.0.9-8.el9.x86_64 libXpm-3.5.13-8.el9_1.x86_64 libjpeg-turbo-2.0.90-6.el9_1.x86_64 libpng-2:1.6.37-12.el9.x86_64 libpq-13.5-1.el9.x86_64 libtiff-4.4.0-8.el9_2.x86_64 libtool-ltdl-2.4.6-45.el9.x86_64 libwebp-1.2.0-6.el9_1.x86_64 libxcb-1.13.1-9.el9.x86_64 libxslt-1.1.34-9.el9.x86_64 net-snmp-libs-1:5.9.1-9.el9.x86_64 nginx-1:1.20.1-14.el9.x86_64 nginx-core-1:1.20.1-14.el9.x86_64 nginx-filesystem-1:1.20.1-14.el9.noarch oniguruma-6.9.6-1.el9.5.x86_64 php-bcmath-8.0.27-1.el9_1.x86_64 php-common-8.0.27-1.el9_1.x86_64 php-fpm-8.0.27-1.el9_1.x86_64 php-gd-8.0.27-1.el9_1.x86_64 php-ldap-8.0.27-1.el9_1.x86_64 php-mbstring-8.0.27-1.el9_1.x86_64 php-pdo-8.0.27-1.el9_1.x86_64 php-pgsql-8.0.27-1.el9_1.x86_64 php-xml-8.0.27-1.el9_1.x86_64 redhat-logos-httpd-90.4-1.el9.noarch unixODBC-2.3.9-4.el9.x86_64 xml-common-0.6.3-58.el9.noarch zabbix-agent-6.0.20-release1.el9.x86_64 zabbix-nginx-conf-6.0.20-release1.el9.noarch zabbix-selinux-policy-6.0.20-release1.el9.x86_64 zabbix-server-pgsql-6.0.20-release1.el9.x86_64 zabbix-sql-scripts-6.0.20-release1.el9.noarch zabbix-web-6.0.20-release1.el9.noarch zabbix-web-deps-6.0.20-release1.el9.noarch zabbix-web-pgsql-6.0.20-release1.el9.noarch Complete!
依存関係でNginxやPHP-FPMはインストールしてくれましたが、PostgreSQLはインストールされないようですね。
ソフトウェア要件を確認したところ、PostgreSQL 13.0-15.X をサポートしているようです。
PostgreSQL 15のインストールします。
# モジュール一覧の確認 $ sudo dnf module list Updating Subscription Management repositories. Unable to read consumer identity This system is not registered with an entitlement server. You can use subscription-manager to register. Last metadata expiration check: 0:03:15 ago on Mon 07 Aug 2023 06:34:30 AM UTC. Red Hat Enterprise Linux 9 for x86_64 - AppStream from RHUI (RPMs) Name Stream Profiles Summary maven 3.8 common [d] Java project management and project comprehension tool nginx 1.22 common [d] nginx webserver nodejs 18 common [d], development, minimal, s2i Javascript runtime php 8.1 common [d], devel, minimal PHP scripting language postgresql 15 client, server PostgreSQL server and client module ruby 3.1 common [d] An interpreter of object-oriented scripting language Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled # PostgreSQL 15のサーバーをインストール $ sudo dnf module install postgresql:15/server Updating Subscription Management repositories. Unable to read consumer identity This system is not registered with an entitlement server. You can use subscription-manager to register. Last metadata expiration check: 0:06:28 ago on Mon 07 Aug 2023 06:34:30 AM UTC. Dependencies resolved. ============================================================================================================================= Package Arch Version Repository Size ============================================================================================================================= Installing group/module packages: postgresql-server x86_64 15.3-1.module+el9.2.0.z+19113+6f5d9d63 rhel-9-appstream-rhui-rpms 6.1 M Installing dependencies: libicu x86_64 67.1-9.el9 rhel-9-baseos-rhui-rpms 9.6 M postgresql x86_64 15.3-1.module+el9.2.0.z+19113+6f5d9d63 rhel-9-appstream-rhui-rpms 1.7 M postgresql-private-libs x86_64 15.3-1.module+el9.2.0.z+19113+6f5d9d63 rhel-9-appstream-rhui-rpms 139 k Installing module profiles: postgresql/server Enabling module streams: postgresql 15 Transaction Summary ============================================================================================================================= Install 4 Packages Total download size: 18 M Installed size: 64 M Is this ok [y/N]: y Downloading Packages: (1/4): postgresql-private-libs-15.3-1.module+el9.2.0.z+19113+6f5d9d63.x86_64.rpm 1.0 MB/s | 139 kB 00:00 . . (中略) . . Installed: libicu-67.1-9.el9.x86_64 postgresql-15.3-1.module+el9.2.0.z+19113+6f5d9d63.x86_64 postgresql-private-libs-15.3-1.module+el9.2.0.z+19113+6f5d9d63.x86_64 postgresql-server-15.3-1.module+el9.2.0.z+19113+6f5d9d63.x86_64 Complete! # インストールが完了したことを確認 $ psql --version psql (PostgreSQL) 15.3
インストールしたパッケージの設定
PostgreSQLの初期設定を行います。
$ sudo postgresql-setup --initdb * Initializing database in '/var/lib/pgsql/data' * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
PostgreSQLを起動させます。
# PostgreSQLの起動 $ sudo systemctl start postgresql # 起動しているか確認 $ systemctl status postgresql ● postgresql.service - PostgreSQL database server Loaded: loaded (/usr/lib/systemd/system/postgresql.service; disabled; preset: disabled) Active: active (running) since Mon 2023-08-07 06:44:30 UTC; 6s ago Process: 15570 ExecStartPre=/usr/libexec/postgresql-check-db-dir postgresql (code=exited, status=0/SUCCESS) Main PID: 15572 (postmaster) Tasks: 7 (limit: 4184) Memory: 17.3M CPU: 42ms CGroup: /system.slice/postgresql.service ├─15572 /usr/bin/postmaster -D /var/lib/pgsql/data ├─15573 "postgres: logger " ├─15574 "postgres: checkpointer " ├─15575 "postgres: background writer " ├─15577 "postgres: walwriter " ├─15578 "postgres: autovacuum launcher " └─15579 "postgres: logical replication launcher " Aug 07 06:44:30 ip-10-1-1-7.ec2.internal systemd[1]: Starting PostgreSQL database server... Aug 07 06:44:30 ip-10-1-1-7.ec2.internal postmaster[15572]: 2023-08-07 06:44:30.174 UTC [15572] LOG: redirecting log output> Aug 07 06:44:30 ip-10-1-1-7.ec2.internal postmaster[15572]: 2023-08-07 06:44:30.174 UTC [15572] HINT: Future log output wil> Aug 07 06:44:30 ip-10-1-1-7.ec2.internal systemd[1]: Started PostgreSQL database server. # 自動起動の有効化 $ sudo systemctl enable postgresql Created symlink /etc/systemd/system/multi-user.target.wants/postgresql.service → /usr/lib/systemd/system/postgresql.service.
PostgreSQL上にZabbix Serverが使用するDBユーザーとDBを作成します。
# sudo した際にカレントディレクトリに対して権限不足でエラーにならないように cd $ cd /tmp/ # DBユーザーの作成 $ sudo -u postgres createuser --pwprompt zabbix Enter password for new role: Enter it again: # DBの作成 $ sudo -u postgres createdb -O zabbix zabbix
psql
で確かにDBユーザーとDBが作成されているか確認しておきます。
$ sudo -u postgres -i $ psql psql (15.3) Type "help" for help. postgres=# \du List of roles Role name | Attributes | Member of -----------+------------------------------------------------------------+----------- postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {} zabbix | | {} postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | ICU Locale | Locale Provider | Access privileges -----------+----------+----------+-------------+-------------+------------+-----------------+----------------------- postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc | =c/postgres + | | | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc | =c/postgres + | | | | | | | postgres=CTc/postgres zabbix | zabbix | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc | (4 rows) postgres=# \q $ exit
スキーマとデータをインポートします。
$ zcat /usr/share/zabbix-sql-scripts/postgresql/server.sql.gz | sudo -u zabbix psql zabbix could not change directory to "/home/ec2-user": Permission denied CREATE TABLE CREATE INDEX CREATE TABLE CREATE INDEX CREATE TABLE CREATE INDEX CREATE INDEX . . (中略) . . INSERT 0 1 INSERT 0 1 INSERT 0 1 INSERT 0 1 INSERT 0 1 INSERT 0 1 COMMIT
DBユーザー作成時に指定したパスワードをZabbix Serverの設定ファイルに埋め込みます。
$ sudo grep DBPassword= /etc/zabbix/zabbix_server.conf # DBPassword= $ sudo vi /etc/zabbix/zabbix_server.conf $ sudo grep DBPassword= /etc/zabbix/zabbix_server.conf DBPassword=<DBユーザーのパスワード>
認証方法をident
からmd5
に変更します。
$ sudo vi /var/lib/pgsql/data/pg_hba.conf $ sudo tail -n20 /var/lib/pgsql/data/pg_hba.conf # If you want to allow non-local connections, you need to add more # "host" records. In that case you will also need to make PostgreSQL # listen on a non-local interface via the listen_addresses # configuration parameter, or via the -i or -h command line switches. # TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all peer # IPv4 local connections: host all all 127.0.0.1/32 md5 # IPv6 local connections: host all all ::1/128 md5 # Allow replication connections from localhost, by a user with the # replication privilege. local replication all peer host replication all 127.0.0.1/32 ident host replication all ::1/128 ident # 設定のリロード $ sudo -u postgres pg_ctl -D /var/lib/pgsql/data reload server signaled
こちらを設定しない場合、ブラウザからZabbixのセットアップをする際に以下のようなエラーを出力してしまいます。
Details Cannot connect to the database. Error connecting to database.
次にNginxの設定を行います。
デフォルトでは以下のような設定がされています。
$ cat /etc/nginx/conf.d/zabbix.conf server { # listen 8080; # server_name example.com; root /usr/share/zabbix; index index.php; location = /favicon.ico { log_not_found off; } location / { try_files $uri $uri/ =404; } location /assets { access_log off; expires 10d; } location ~ /\.ht { deny all; } location ~ /(api\/|conf[^\.]|include|locale) { deny all; return 404; } location /vendor { deny all; return 404; } location ~ [^/]\.php(/|$) { fastcgi_pass unix:/run/php-fpm/zabbix.sock; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_index index.php; fastcgi_param DOCUMENT_ROOT /usr/share/zabbix; fastcgi_param SCRIPT_FILENAME /usr/share/zabbix$fastcgi_script_name; fastcgi_param PATH_TRANSLATED /usr/share/zabbix$fastcgi_script_name; include fastcgi_params; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_intercept_errors on; fastcgi_ignore_client_abort off; fastcgi_connect_timeout 60; fastcgi_send_timeout 180; fastcgi_read_timeout 180; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; } }
リスナーポートとサーバー名をコメントアウトして設定してあげましょう。
$ sudo vi /etc/nginx/conf.d/zabbix.conf $ sudo head /etc/nginx/conf.d/zabbix.conf server { listen 8080; server_name non-97.net; root /usr/share/zabbix; index index.php; location = /favicon.ico { log_not_found off;
Zabbix ServerやZabbix Agent、Nginx、PHP-FPMを起動させます。
$ sudo systemctl start zabbix-server zabbix-agent nginx php-fpm $ sudo systemctl enable zabbix-server zabbix-agent nginx php-fpm Created symlink /etc/systemd/system/multi-user.target.wants/zabbix-server.service → /usr/lib/systemd/system/zabbix-server.service. Created symlink /etc/systemd/system/multi-user.target.wants/zabbix-agent.service → /usr/lib/systemd/system/zabbix-agent.service. Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service. Created symlink /etc/systemd/system/multi-user.target.wants/php-fpm.service → /usr/lib/systemd/system/php-fpm.service. $ sudo systemctl status zabbix-server zabbix-agent nginx php-fpm ● zabbix-server.service - Zabbix Server Loaded: loaded (/usr/lib/systemd/system/zabbix-server.service; enabled; preset: disabled) Active: active (running) since Tue 2023-08-08 01:32:13 UTC; 18s ago Main PID: 13084 (zabbix_server) Tasks: 48 (limit: 10562) Memory: 44.4M CPU: 453ms CGroup: /system.slice/zabbix-server.service ├─13084 /usr/sbin/zabbix_server -c /etc/zabbix/zabbix_server.conf ├─13113 "/usr/sbin/zabbix_server: ha manager" ├─13115 "/usr/sbin/zabbix_server: service manager #1 [processed 0 events, updated 0 event tags, deleted 0 problems, synced 0 service updat> ├─13116 "/usr/sbin/zabbix_server: configuration syncer [synced configuration in 0.130928 sec, idle 60 sec]" ├─13120 "/usr/sbin/zabbix_server: alert manager #1 [sent 0, failed 0 alerts, idle 5.004874 sec during 5.005005 sec]" ├─13121 "/usr/sbin/zabbix_server: alerter #1 started" ├─13122 "/usr/sbin/zabbix_server: alerter #2 started" ├─13123 "/usr/sbin/zabbix_server: alerter #3 started" ├─13124 "/usr/sbin/zabbix_server: preprocessing manager #1 [queued 0, processed 11 values, idle 5.331564 sec during 5.331815 sec]" ├─13125 "/usr/sbin/zabbix_server: preprocessing worker #1 started" ├─13126 "/usr/sbin/zabbix_server: preprocessing worker #2 started" ├─13127 "/usr/sbin/zabbix_server: preprocessing worker #3 started" ├─13128 "/usr/sbin/zabbix_server: lld manager #1 [processed 1 LLD rules, idle 5.424885sec during 5.425002 sec]" ├─13130 "/usr/sbin/zabbix_server: lld worker #1 started" ├─13131 "/usr/sbin/zabbix_server: lld worker #2 [processed 1 LLD rules, idle 11.312291 sec during 11.431958 sec]" ├─13132 "/usr/sbin/zabbix_server: housekeeper [startup idle for 30 minutes]" ├─13133 "/usr/sbin/zabbix_server: timer #1 [updated 0 hosts, suppressed 0 events in 0.002956 sec, idle 45 sec]" ├─13134 "/usr/sbin/zabbix_server: http poller #1 [got 0 values in 0.000561 sec, idle 5 sec]" ├─13135 "/usr/sbin/zabbix_server: discoverer #1 [processed 0 rules in 0.003052 sec, idle 60 sec]" ├─13136 "/usr/sbin/zabbix_server: history syncer #1 [processed 0 values, 0 triggers in 0.000017 sec, idle 1 sec]" ├─13141 "/usr/sbin/zabbix_server: history syncer #2 [processed 0 values, 0 triggers in 0.000018 sec, idle 1 sec]" ├─13142 "/usr/sbin/zabbix_server: history syncer #3 [processed 0 values, 0 triggers in 0.000019 sec, idle 1 sec]" ├─13143 "/usr/sbin/zabbix_server: history syncer #4 [processed 0 values, 0 triggers in 0.000022 sec, idle 1 sec]" ├─13144 "/usr/sbin/zabbix_server: escalator #1 [processed 0 escalations in 0.001906 sec, idle 3 sec]" ├─13145 "/usr/sbin/zabbix_server: proxy poller #1 [exchanged data with 0 proxies in 0.000029 sec, idle 5 sec]" ├─13147 "/usr/sbin/zabbix_server: self-monitoring [processed data in 0.000038 sec, idle 1 sec]" ├─13150 "/usr/sbin/zabbix_server: task manager [processed 0 task(s) in 0.000435 sec, idle 5 sec]" ├─13151 "/usr/sbin/zabbix_server: poller #1 [got 1 values in 0.000338 sec, idle 5 sec]" ├─13152 "/usr/sbin/zabbix_server: poller #2 [got 0 values in 0.000030 sec, idle 5 sec]" ├─13156 "/usr/sbin/zabbix_server: poller #3 [got 0 values in 0.000012 sec, idle 5 sec]" ├─13157 "/usr/sbin/zabbix_server: poller #4 [got 0 values in 0.000058 sec, idle 5 sec]" ├─13161 "/usr/sbin/zabbix_server: poller #5 [got 0 values in 0.000041 sec, idle 5 sec]" ├─13162 "/usr/sbin/zabbix_server: unreachable poller #1 [got 0 values in 0.000033 sec, idle 5 sec]" ├─13163 "/usr/sbin/zabbix_server: trapper #1 [processed data in 0.000000 sec, waiting for connection]" ├─13165 "/usr/sbin/zabbix_server: trapper #2 [processed data in 0.000000 sec, waiting for connection]" ├─13166 "/usr/sbin/zabbix_server: trapper #3 [processed data in 0.000000 sec, waiting for connection]" ├─13167 "/usr/sbin/zabbix_server: trapper #4 [processed data in 0.000000 sec, waiting for connection]" ├─13169 "/usr/sbin/zabbix_server: trapper #5 [processed data in 0.000000 sec, waiting for connection]" ├─13170 "/usr/sbin/zabbix_server: icmp pinger #1 [got 0 values in 0.000029 sec, idle 5 sec]" ├─13172 "/usr/sbin/zabbix_server: alert syncer [queued 0 alerts(s), flushed 0 result(s) in 0.000757 sec, idle 1 sec]" ├─13174 "/usr/sbin/zabbix_server: history poller #1 [got 0 values in 0.000019 sec, idle 1 sec]" ├─13175 "/usr/sbin/zabbix_server: history poller #2 [got 0 values in 0.000021 sec, idle 1 sec]" ├─13177 "/usr/sbin/zabbix_server: history poller #3 [got 0 values in 0.000025 sec, idle 1 sec]" ├─13180 "/usr/sbin/zabbix_server: history poller #4 [got 1 values in 0.000091 sec, idle 1 sec]" ├─13181 "/usr/sbin/zabbix_server: history poller #5 [got 0 values in 0.000024 sec, idle 1 sec]" ├─13182 "/usr/sbin/zabbix_server: availability manager #1 [queued 0, processed 0 values, idle 5.005339 sec during 5.005466 sec]" ├─13186 "/usr/sbin/zabbix_server: trigger housekeeper [startup idle for 60 second(s)]" └─13187 "/usr/sbin/zabbix_server: odbc poller #1 [got 0 values in 0.000042 sec, idle 5 sec]" Aug 08 01:32:13 ip-10-1-1-26.ec2.internal systemd[1]: Starting Zabbix Server... Aug 08 01:32:13 ip-10-1-1-26.ec2.internal systemd[1]: Started Zabbix Server. ● zabbix-agent.service - Zabbix Agent Loaded: loaded (/usr/lib/systemd/system/zabbix-agent.service; enabled; preset: disabled) Active: active (running) since Tue 2023-08-08 01:32:13 UTC; 19s ago Main PID: 13075 (zabbix_agentd) Tasks: 6 (limit: 10562) Memory: 3.6M CPU: 32ms CGroup: /system.slice/zabbix-agent.service ├─13075 /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf ├─13076 "/usr/sbin/zabbix_agentd: collector [idle 1 sec]" ├─13077 "/usr/sbin/zabbix_agentd: listener #1 [waiting for connection]" ├─13078 "/usr/sbin/zabbix_agentd: listener #2 [waiting for connection]" ├─13079 "/usr/sbin/zabbix_agentd: listener #3 [waiting for connection]" └─13080 "/usr/sbin/zabbix_agentd: active checks #1 [idle 1 sec]" Aug 08 01:32:13 ip-10-1-1-26.ec2.internal systemd[1]: Starting Zabbix Agent... Aug 08 01:32:13 ip-10-1-1-26.ec2.internal systemd[1]: Started Zabbix Agent. ● nginx.service - The nginx HTTP and reverse proxy server Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: disabled) Drop-In: /usr/lib/systemd/system/nginx.service.d └─php-fpm.conf Active: active (running) since Tue 2023-08-08 01:32:13 UTC; 19s ago Main PID: 13092 (nginx) Tasks: 3 (limit: 10562) Memory: 3.0M CPU: 39ms CGroup: /system.slice/nginx.service ├─13092 "nginx: master process /usr/sbin/nginx" ├─13093 "nginx: worker process" └─13094 "nginx: worker process" Aug 08 01:32:13 ip-10-1-1-26.ec2.internal systemd[1]: Starting The nginx HTTP and reverse proxy server... Aug 08 01:32:13 ip-10-1-1-26.ec2.internal nginx[13089]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok Aug 08 01:32:13 ip-10-1-1-26.ec2.internal nginx[13089]: nginx: configuration file /etc/nginx/nginx.conf test is successful Aug 08 01:32:13 ip-10-1-1-26.ec2.internal systemd[1]: Started The nginx HTTP and reverse proxy server. ● php-fpm.service - The PHP FastCGI Process Manager Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; preset: disabled) Active: active (running) since Tue 2023-08-08 01:32:13 UTC; 18s ago Main PID: 13088 (php-fpm) Status: "Processes active: 0, idle: 10, Requests: 0, slow: 0, Traffic: 0req/sec" Tasks: 11 (limit: 10562) Memory: 13.5M CPU: 88ms CGroup: /system.slice/php-fpm.service ├─13088 "php-fpm: master process (/etc/php-fpm.conf)" ├─13095 "php-fpm: pool www" ├─13097 "php-fpm: pool www" ├─13098 "php-fpm: pool www" ├─13099 "php-fpm: pool www" ├─13100 "php-fpm: pool www" ├─13101 "php-fpm: pool zabbix" ├─13102 "php-fpm: pool zabbix" ├─13103 "php-fpm: pool zabbix" ├─13104 "php-fpm: pool zabbix" └─13105 "php-fpm: pool zabbix" Aug 08 01:32:13 ip-10-1-1-26.ec2.internal systemd[1]: Starting The PHP FastCGI Process Manager... Aug 08 01:32:13 ip-10-1-1-26.ec2.internal systemd[1]: Started The PHP FastCGI Process Manager.
TCP/8080でNginxがLISTENしているのかもチェックしましょう。
$ sudo ss -lntp State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=934,fd=3)) LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=13094,fd=7),("nginx",pid=13093,fd=7),("nginx",pid=13092,fd=7)) LISTEN 0 511 0.0.0.0:8080 0.0.0.0:* users:(("nginx",pid=13094,fd=6),("nginx",pid=13093,fd=6),("nginx",pid=13092,fd=6)) LISTEN 0 244 127.0.0.1:5432 0.0.0.0:* users:(("postmaster",pid=12570,fd=7)) LISTEN 0 4096 0.0.0.0:10051 0.0.0.0:* users:(("zabbix_server",pid=13187,fd=9),("zabbix_server",pid=13186,fd=9),("zabbix_server",pid=13182,fd=9),("zabbix_server",pid=13181,fd=9),("zabbix_server",pid=13180,fd=9),("zabbix_server",pid=13177,fd=9),("zabbix_server",pid=13175,fd=9),("zabbix_server",pid=13174,fd=9),("zabbix_server",pid=13172,fd=9),("zabbix_server",pid=13170,fd=9),("zabbix_server",pid=13169,fd=9),("zabbix_server",pid=13167,fd=9),("zabbix_server",pid=13166,fd=9),("zabbix_server",pid=13165,fd=9),("zabbix_server",pid=13163,fd=9),("zabbix_server",pid=13162,fd=9),("zabbix_server",pid=13161,fd=9),("zabbix_server",pid=13157,fd=9),("zabbix_server",pid=13156,fd=9),("zabbix_server",pid=13152,fd=9),("zabbix_server",pid=13151,fd=9),("zabbix_server",pid=13150,fd=9),("zabbix_server",pid=13147,fd=9),("zabbix_server",pid=13145,fd=9),("zabbix_server",pid=13144,fd=9),("zabbix_server",pid=13143,fd=9),("zabbix_server",pid=13142,fd=9),("zabbix_server",pid=13141,fd=9),("zabbix_server",pid=13136,fd=9),("zabbix_server",pid=13135,fd=9),("zabbix_server",pid=13134,fd=9),("zabbix_server",pid=13133,fd=9),("zabbix_server",pid=13132,fd=9),("zabbix_server",pid=13131,fd=9),("zabbix_server",pid=13130,fd=9),("zabbix_server",pid=13128,fd=9),("zabbix_server",pid=13127,fd=9),("zabbix_server",pid=13126,fd=9),("zabbix_server",pid=13125,fd=9),("zabbix_server",pid=13124,fd=9),("zabbix_server",pid=13123,fd=9),("zabbix_server",pid=13122,fd=9),("zabbix_server",pid=13121,fd=9),("zabbix_server",pid=13120,fd=9),("zabbix_server",pid=13116,fd=9),("zabbix_server",pid=13115,fd=9),("zabbix_server",pid=13084,fd=9)) LISTEN 0 4096 0.0.0.0:10050 0.0.0.0:* users:(("zabbix_agentd",pid=13080,fd=4),("zabbix_agentd",pid=13079,fd=4),("zabbix_agentd",pid=13078,fd=4),("zabbix_agentd",pid=13077,fd=4),("zabbix_agentd",pid=13076,fd=4),("zabbix_agentd",pid=13075,fd=4)) LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=934,fd=4)) LISTEN 0 244 [::1]:5432 [::]:* users:(("postmaster",pid=12570,fd=6)) LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=13094,fd=8),("nginx",pid=13093,fd=8),("nginx",pid=13092,fd=8)) LISTEN 0 4096 [::]:10051 [::]:* users:(("zabbix_server",pid=13187,fd=10),("zabbix_server",pid=13186,fd=10),("zabbix_server",pid=13182,fd=10),("zabbix_server",pid=13181,fd=10),("zabbix_server",pid=13180,fd=10),("zabbix_server",pid=13177,fd=10),("zabbix_server",pid=13175,fd=10),("zabbix_server",pid=13174,fd=10),("zabbix_server",pid=13172,fd=10),("zabbix_server",pid=13170,fd=10),("zabbix_server",pid=13169,fd=10),("zabbix_server",pid=13167,fd=10),("zabbix_server",pid=13166,fd=10),("zabbix_server",pid=13165,fd=10),("zabbix_server",pid=13163,fd=10),("zabbix_server",pid=13162,fd=10),("zabbix_server",pid=13161,fd=10),("zabbix_server",pid=13157,fd=10),("zabbix_server",pid=13156,fd=10),("zabbix_server",pid=13152,fd=10),("zabbix_server",pid=13151,fd=10),("zabbix_server",pid=13150,fd=10),("zabbix_server",pid=13147,fd=10),("zabbix_server",pid=13145,fd=10),("zabbix_server",pid=13144,fd=10),("zabbix_server",pid=13143,fd=10),("zabbix_server",pid=13142,fd=10),("zabbix_server",pid=13141,fd=10),("zabbix_server",pid=13136,fd=10),("zabbix_server",pid=13135,fd=10),("zabbix_server",pid=13134,fd=10),("zabbix_server",pid=13133,fd=10),("zabbix_server",pid=13132,fd=10),("zabbix_server",pid=13131,fd=10),("zabbix_server",pid=13130,fd=10),("zabbix_server",pid=13128,fd=10),("zabbix_server",pid=13127,fd=10),("zabbix_server",pid=13126,fd=10),("zabbix_server",pid=13125,fd=10),("zabbix_server",pid=13124,fd=10),("zabbix_server",pid=13123,fd=10),("zabbix_server",pid=13122,fd=10),("zabbix_server",pid=13121,fd=10),("zabbix_server",pid=13120,fd=10),("zabbix_server",pid=13116,fd=10),("zabbix_server",pid=13115,fd=10),("zabbix_server",pid=13084,fd=10)) LISTEN 0 4096 [::]:10050 [::]:* users:(("zabbix_agentd",pid=13080,fd=5),("zabbix_agentd",pid=13079,fd=5),("zabbix_agentd",pid=13078,fd=5),("zabbix_agentd",pid=13077,fd=5),("zabbix_agentd",pid=13076,fd=5),("zabbix_agentd",pid=13075,fd=5))
LISTENしていますね。TCP/80はNginxのデフォルトのリスナーポートです。不要であれば/etc/nginx/nginx.conf
を変更しましょう。
WebブラウザからのZabbixのセットアップ
それでは、WebブラウザからもZabbixのセットアップを行います。
SSMセッションマネージャーのポートフォワーディングでZabbixのWebコンソールにアクセスできるようにしてあげます。
$ aws ssm start-session --target i-08691afe0dc219e88 \ --document-name AWS-StartPortForwardingSession \ --parameters '{"portNumber":["8080"],"localPortNumber":["18080"]}' Starting session with SessionId: botocore-session-1691458491-030419d0a04cec671 Port 18080 opened for sessionId botocore-session-1691458491-030419d0a04cec671. Waiting for connections...
`http://localhost:18080/`にアクセスします。
すると、以下のようにZabbixのWebコンソールが表示されました。
Next step
をクリックします。
要件を満たしているかチェックされます。全てOKだったのでNext step
をクリックします。
DBとの接続設定を行います。パスワードを入力して、Next step
をクリックします。
Zabbix Serverの名前とタイムゾーン、テーマを設定します。Zabbix Server名のみ入力してNext step
をクリックします。
最終チェックです。内容を確認してNext step
をクリックします。
無事セットアップが完了しました。
Zabbixのアイテムの追加
Zabbixのアイテムの追加を行います。専用のホストは作成せずにZabbix Sereverに追加します。
ZabbixのWebコンソールにサインインします。デフォルトのUsernameはAdmin
でPasswordはzabbix
です。
Global viewが表示されました。System Informationの様子から各種データが取得できていそうですね。
アイテムを追加したいので、Configuration
-Hosts
からZabbix ServerのItems
をクリックします。
Create Item
をクリックします。
アイテムを定義します。
Zabbix Senderでデータを送りつけるので、TypeはZabbix trapper
とします。KeyはCloudWatch Alarmのイベントというのが分かりやすいようにcloudwatch.alarm.test-item
としました。また、Allowed hostsは自ホストとVPCのCIDRを設定しました。
ZabbixのTrapper itemの詳細は以下Zabbixの公式ドキュメントをご覧ください。
設定が完了したらAdd
をクリックします。
Zabbix Senderの動作確認
Zabbix Senderで作成したアイテムにデータを追加できるのか動作確認をしてみます。
Zabbix ServerにZabbix Senderをインストールします。
$ sudo dnf install zabbix-sender Updating Subscription Management repositories. Unable to read consumer identity This system is not registered with an entitlement server. You can use subscription-manager to register. Last metadata expiration check: 0:17:04 ago on Mon 07 Aug 2023 08:21:43 AM UTC. Dependencies resolved. ============================================================================================================================= Package Architecture Version Repository Size ============================================================================================================================= Installing: zabbix-sender x86_64 6.0.20-release1.el9 zabbix 402 k Transaction Summary ============================================================================================================================= Install 1 Package Total download size: 402 k Installed size: 1.8 M Is this ok [y/N]: y Downloading Packages: zabbix-sender-6.0.20-release1.el9.x86_64.rpm 491 kB/s | 402 kB 00:00 ----------------------------------------------------------------------------------------------------------------------------- Total 489 kB/s | 402 kB 00:00 Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Installing : zabbix-sender-6.0.20-release1.el9.x86_64 1/1 Running scriptlet: zabbix-sender-6.0.20-release1.el9.x86_64 1/1 Verifying : zabbix-sender-6.0.20-release1.el9.x86_64 1/1 Installed products updated. Installed: zabbix-sender-6.0.20-release1.el9.x86_64 Complete!
zabbix_sender
コマンドの詳細は以下Zabbix公式ドキュメントをご覧ください。
zabbix_sender
で先ほど作成したアイテムに対して適当なテキストを送りつけます。
$ zabbix_sender -z 127.0.0.1 -s "Zabbix server" -k cloudwatch.alarm.test-item -o "test message" Response from "127.0.0.1:10051": "processed: 1; failed: 0; total: 1; seconds spent: 0.000079" sent: 1; skipped: 0; total: 1
作成したアイテムcloudwatch.alarm.test-item
を確認します。
Zabbix Senderで送信したデータが登録されていますね。
CloudWatchアラームのタグ付け
AWS CDKでデプロイしてから気づいたのですが、CloudWatchアラームはAWS CDKでタグ付けができないようでした。
しょうがないので手動でCloudWatchアラームにZabbixのホストとキーを表すタグの付与を行います。
$ aws cloudwatch tag-resource \ --resource-arn "arn:aws:cloudwatch:us-east-1:<AWSアカウントID>:alarm:alarm-test-to-zabbix" \ --tags Key="Zabbix Host,Value"="Zabbix server" $ aws cloudwatch tag-resource \ --resource-arn "arn:aws:cloudwatch:us-east-1:<AWSアカウントID>:alarm:alarm-test-to-zabbix" \ --tags Key="Zabbix Item Key,Value"="cloudwatch.alarm.test-item" $ aws resourcegroupstaggingapi get-resources --resource-type-filters cloudwatch:alarm { "ResourceTagMappingList": [ { "ResourceARN": "arn:aws:cloudwatch:us-east-1:<AWSアカウントID>:alarm:alarm-test-to-zabbix", "Tags": [ { "Key": "Zabbix Host", "Value": "Zabbix server" }, { "Key": "Zabbix Item Key", "Value": "cloudwatch.alarm.test-item" } ] } ] }
動作確認
それでは動作確認をします。
適当なStep Functionsのステートマシンを実行します。
しばらくすると、CloudWatchアラームがアラーム状態となり、Lambda関数が起動しました。
Lambda関数のログは以下の通りです。
INIT_START Runtime Version: python:3.11.v8 Runtime Version ARN: arn:aws:lambda:us-east-1::runtime:a96d37d47210bbc80cb11c50028140d002b18ce0f3a93200d92ac5cac3132669 START RequestId: 9943ef85-0b93-4368-b94d-16abc88e5f1e Version: $LATEST [INFO] 2023-08-07T21:50:27.800Z 9943ef85-0b93-4368-b94d-16abc88e5f1e {'version': '0', 'id': '5144d242-9da0-562f-4eac-6ab3c9494e7d', 'detail-type': 'CloudWatch Alarm State Change', 'source': 'aws.cloudwatch', 'account': '<AWSアカウントID>', 'time': '2023-08-07T21:50:27Z', 'region': 'us-east-1', 'resources': ['arn:aws:cloudwatch:us-east-1:<AWSアカウントID>:alarm:alarm-test-to-zabbix'], 'detail': {'alarmName': 'alarm-test-to-zabbix', 'state': {'value': 'ALARM', 'reason': 'Threshold Crossed: 1 datapoint [5000.0 (07/08/23 21:49:00)] was greater than the threshold (1.0).', 'reasonData': '{"version":"1.0","queryDate":"2023-08-07T21:50:27.439+0000","startDate":"2023-08-07T21:49:00.000+0000","statistic":"Average","period":60,"recentDatapoints":[5000.0],"threshold":1.0,"evaluatedDatapoints":[{"timestamp":"2023-08-07T21:49:00.000+0000","sampleCount":1.0,"value":5000.0}]}', 'timestamp': '2023-08-07T21:50:27.441+0000'}, 'previousState': {'value': 'INSUFFICIENT_DATA', 'reason': 'Insufficient Data: 1 datapoint was unknown.', 'reasonData': '{"version":"1.0","queryDate":"2023-08-07T21:42:27.441+0000","statistic":"Average","period":60,"recentDatapoints":[],"threshold":1.0,"evaluatedDatapoints":[{"timestamp":"2023-08-07T21:41:00.000+0000"}]}', 'timestamp': '2023-08-07T21:42:27.442+0000'}, 'configuration': {'metrics': [{'id': '72c4e800-7f7f-a89f-c1b1-6dc1c864eac3', 'metricStat': {'metric': {'namespace': 'AWS/States', 'name': 'ProvisionedRefillRate', 'dimensions': {'ServiceMetric': 'StateTransition'}}, 'period': 60, 'stat': 'Average'}, 'returnData': True}], 'description': 'test description'}}} [INFO] 2023-08-07T21:50:27.954Z 9943ef85-0b93-4368-b94d-16abc88e5f1e Found credentials in environment variables. [INFO] 2023-08-07T21:50:28.714Z 9943ef85-0b93-4368-b94d-16abc88e5f1e { "processed": 1, "failed": 0, "total": 1, "time": "0.000255", "chunk": 1 } END RequestId: 9943ef85-0b93-4368-b94d-16abc88e5f1e REPORT RequestId: 9943ef85-0b93-4368-b94d-16abc88e5f1e Duration: 933.61 ms Billed Duration: 934 ms Memory Size: 128 MB Max Memory Used: 28 MB
問題なく送信できていそうですね。
Zabbixのアイテムも確認してみましょう。
CloudWatchアラームのイベントが追加されていました。
このまま放置していると、アラーム状態からデータ不足INSUFFICIENT_DATA
に遷移したため、イベントがされに追加されました。
これであとはZabbixでトリガーやアクションを設定してあげれば、Zabbixによる監視ができそうです。
何が何でもZabbixと連携させたい時に
CloudWatchアラームのイベントをZabbixに連携させてみました。
何が何でもZabbixと連携させたい時にこちらの手法を使ってみてください。
ただ、繰り返しになりますが提供されていない機能を頑張って作り込んでまで実装するのは個人的にはオススメしません。今後の運用を考えると、できるだけシンプルにしたいところです。
Zabbixをはじめ、一つの製品にこだわり過ぎず、柔軟に対応することが望ましいと考えます。
この記事が誰かの助けになれば幸いです。
以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!